package org.dromara.admin.domain.vo;

import org.dromara.admin.domain.Order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.admin.enums.*;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;


/**
 * 订单主（客户ID和供应商ID必须二选一，由应用程序保证）视图对象 bi_order
 *
 * @author Lion Li
 * @date 2025-10-10
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = Order.class)
public class OrderVo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 订单唯一ID
     */
    @ExcelProperty(value = "订单唯一ID")
    private Long id;

    /**
     * 订单编号（唯一）
     */
    @ExcelProperty(value = "订单编号", converter = ExcelDictConvert.class)
    private String orderNo;

    /**
     * 开单人ID（关联bi_employee.id）
     */
    @ExcelProperty(value = "开单人ID", converter = ExcelDictConvert.class)
    private Long creatorId;

    /**
     * 开单人姓名
     */
    @ExcelProperty(value = "开单人姓名")
    private String creatorName;

    /**
     * 模板ID（关联bi_template_market.id）
     */
    @ExcelProperty(value = "模板ID", converter = ExcelDictConvert.class)
    private Long templateId;

    /**
     * 订单类型：发货单（DELIVERY）,进货单（PURCHASE）,报价单（QUOTATION）,销售单（SALES）,采购单（PROCUREMENT）,对账单（STATEMENT）,退货单（RETURN）,物流单（LOGISTICS）
     */
    @ExcelProperty(value = "订单类型：发货单", converter = ExcelDictConvert.class)
    private TemplateCategoryEnum orderType;

    /**
     * 应收/应付金额（发货单=应收，进货单=应付）
     */
    @ExcelProperty(value = "应收/应付金额", converter = ExcelDictConvert.class)
    private BigDecimal amount;

    /**
     * 优惠金额
     */
    @ExcelProperty(value = "优惠金额")
    private BigDecimal discountAmount;

    /**
     * 实收/实付金额（amount - discount_amount）
     */
    @ExcelProperty(value = "实收/实付金额", converter = ExcelDictConvert.class)
    private BigDecimal actualAmount;

    /**
     * 结算状态：未结清(UNPAID)、部分结清(PARTIAL)、已结清(PAID)（“结算模式”开启时生效）
     */
    @ExcelProperty(value = "结算状态：未结清(UNPAID)、部分结清(PARTIAL)、已结清(PAID)", converter = ExcelDictConvert.class)
    private SettlementStatusEnum settleStatus;

    /**
     * 图片凭证（多个URL用逗号分隔，如付款凭证）
     */
    @ExcelProperty(value = "图片凭证", converter = ExcelDictConvert.class)
    private String voucherImgs;

    /**
     * 签名
     */
    @ExcelProperty(value = "签名")
    private String signature;

    /**
     * 标签ID（企业版，预留）
     */
    @ExcelProperty(value = "标签ID", converter = ExcelDictConvert.class)
    private Long tagId;

    /**
     * 地址关联id
     */
    @ExcelProperty(value = "地址关联id")
    private Long addressId;

    /**
     * 收单方-客户ID（关联bi_customer.id，与supplier_id二选一）
     */
    @ExcelProperty(value = "收单方-客户ID", converter = ExcelDictConvert.class)
    private Long customerId;

    /**
     * 客户姓名
     */
    @ExcelProperty(value = "客户姓名")
    private String customerName;

    /**
     * 客户联系人姓名
     */
    @ExcelProperty(value = "客户联系人姓名")
    private String customerContactName;

    /**
     * 客户电话
     */
    @ExcelProperty(value = "客户电话")
    private String customerPhone;

    /**
     * 客户地址
     */
    @ExcelProperty(value = "客户地址")
    private String customerAddress;

    /**
     * 客户类型：客户(CUSTOMER)、供应商(SUPPLIER)
     */
    @ExcelProperty(value = "客户类型：客户(CUSTOMER)、供应商(SUPPLIER)")
    private CustomerTypeEnum customerType;

    /**
     * 开单方主体ID（关联bi_company.id）
     */
    @ExcelProperty(value = "开单方主体ID", converter = ExcelDictConvert.class)
    private Long companyId;

    /**
     * 主体名称
     */
    @ExcelProperty(value = "主体名称")
    private String companyName;

    /**
     * 主体联系人名称
     */
    @ExcelProperty(value = "主体联系人名称")
    private String companyContactName;

    /**
     * 主体地址
     */
    @ExcelProperty(value = "主体地址")
    private String companyAddress;

    /**
     * 主体联系电话
     */
    @ExcelProperty(value = "主体联系电话")
    private String companyPhone;

    /**
     * 快递单号
     */
    @ExcelProperty(value = "快递单号")
    private String expressNo;

    /**
     * 快递公司
     */
    @ExcelProperty(value = "快递公司")
    private String expressCompany;

    /**
     * 快递费用
     */
    @ExcelProperty(value = "快递费用")
    private BigDecimal expressFee;

    /**
     * 作废（Y:正常，N:作废）
     */
    @ExcelProperty(value = "是否作废")
    private IsCancelEnum isCancel;

    /**
     * 备注（支持快捷备注）
     */
    @ExcelProperty(value = "备注", converter = ExcelDictConvert.class)
    private String remark;

    /**
     * 创建时间
     */
    @ExcelProperty(value = "创建时间")
    private Date createTime;

    /**
     * 订单关联的产品列表
     */
    private List<OrderProductVo> orderProductList;

}
